package linked_node;

public class simpleSingleHeroLinkedList {
    public static void main(String[] args) {
        controlHeroNode heroNo = new controlHeroNode();
        heroNode hero1 = new heroNode(1, "宋江", "天魁星");
        heroNode hero2 = new heroNode(2, "卢俊义", "玉麒麟");
        heroNode hero3 = new heroNode(3, "吴用", "智多星");
        heroNo.addNodeByOrder(hero3);
        heroNo.addNodeByOrder(hero2);
        heroNo.addNodeByOrder(hero1);
        heroNo.addNodeByOrder(hero2);
        heroNo.scanLinkList();
    }
}

// 使用一个类来控制节点，管理英雄
class controlHeroNode {
    // 为单链表创建一个头结点,不用赋予它信息
    heroNode head = new heroNode(0, "", "");

    // 按英雄的排名添加英雄节点
    public void addNodeByOrder (heroNode hero) {
        // 使用临时节点移动来遍历单链表，寻找合适位置
        heroNode tmpNode = head;
        boolean flag = false; // 标记量，默认当前英雄排名不存在
        while (true) {
            // 先判断当前节点是否为链表的最后一个节点
            // 若为空则是向该节点插入英雄节点
            if (tmpNode.next == null) {
                break;
            }
            // 当当前临时节点的下一节点的排名大于英雄排名时，则找到合适位置
            if (tmpNode.next.no > hero.no) {
                break;
            }
            // 若tmpNode的no不大于hero的no,需要判断当前英雄排名是否已经存在（即等于当前tmpNode的排名）,若存在，则不能插入
            if (tmpNode.next.no == hero.no) {
                System.out.printf("第 %d 名已被人占领~\n", hero.no);
                return;
            }
            // 上述判断后都没有找到，则移动临时节点指向下一节点
            tmpNode = tmpNode.next;
        }
        hero.next = tmpNode.next;
        tmpNode.next = hero;
    }

    // 为单链表添加一个节点
    public void addNode (heroNode hero) {
        // 寻找当前链表中的节点的next为空的那一个节点
        // 因为头结点不能移动，所以用一个临时节点来移动遍历链表,让它先指向head
        heroNode tmpNode = head;
        while (true) {
            if (tmpNode.next == null) {
                break;
            }
            tmpNode = tmpNode.next;
        }
        tmpNode.next = hero;
    }

    // 遍历当前链表,不用加上头结点！！！
    public void scanLinkList() {
        // 首先判断链表是否为空
        if (head.next == null) {
            System.out.println("当前英雄榜上空空如也~");
            return;
        }
        heroNode tmpNode = head.next;
        while (true) {
            // 判断当前节点是否为最后一个节点
            if (tmpNode == null) {
                return;
            }
            System.out.println(tmpNode);
            tmpNode = tmpNode.next;
        }
    }
}

// 使用一个用来表示英雄属性的节点的类
class heroNode {
    public int no; // 表示英雄排名
    private String name;
    private String nickname; // 表示英雄的别名
    public heroNode next; // 表示与这个节点相连的下一个节点

    // 创建英雄节点的构造方法
    public heroNode (int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    // 重写toString()方法用于打印英雄信息
    @Override
    public String toString() {
        return "heroNode{" +
                "no=" + no +
                ", name='" + name + "'" +
                ", nickname='" + nickname + "'}"; // 最后的next不用打印，要是加上的话会自动打印后面节点的信息
    }
}